#ifndef __UARTPROTOCOL_H
#define __UARTPROTOCOL_H

// #include <string.h>
// #include <stdbool.h>
// #include <stdarg.h>
// #include <stdio.h>
// #include "stm32f1xx.h"
// #include "ring_buffer.h"
// #include "module_log.h"
// #include "SEGGER_RTT.h"
#include "NEC.h"

#include "GlobalConfig.h"
#define UART_PROTOCOL_DEBUG_ENABLE 1
#define UART_PROTOCOL_HEADER1 0xAA
#define UART_PROTOCOL_HEADER2 0x55
#define UART_PROTOCOL_BUFFSIZE 256

// 下划线命名：函数
// 驼峰命名：类型、变量

typedef struct
{
    uint8_t header[2]; // 帧头
    uint8_t cmd;       // 命令字
    uint16_t length;   // u8数据长度
    uint8_t data[UART_PROTOCOL_BUFFSIZE];
    uint8_t checksum; // 校验和 cmd+length+data
} UartProtocol_Def;

typedef struct
{
    uint8_t uartRxBuff[UART_PROTOCOL_BUFFSIZE]; // 接收缓冲区
    RingBuffer_Def rb_rxBuff;                   // 接收缓冲区
    UartProtocol_Def frame;                     // 当前正在接收的帧
    uint8_t isFrameDone;                        // 帧接收完成标志
    UART_HandleTypeDef *huart;                  // UART句柄
} UartProtocolCtrl_Def;
// 数据载荷初始化
void UART_Protocol_Init(UartProtocol_Def *p);
// 计算校验和
uint8_t UART_Protocol_CalculateChecksum(UartProtocol_Def *p);

void UART_Protocol_Log(const char *format, ...);
///////////////     control     ////////////////////////
// 控制器初始化
void UART_Protocol_Ctrl_Init(UartProtocolCtrl_Def *upc, UART_HandleTypeDef *huart);
// 开启DMA和IDLE中断接收数据
void UART_Protocol_BeginReceive(UartProtocolCtrl_Def *upc);
// 写在中断里的判断和处理
void UART_Protocol_IRQHandler(UartProtocolCtrl_Def *upc);

// 将接受到的数据放入环形缓冲区
void UART_Protocol_Ctrl_DataToRingBuff(UartProtocolCtrl_Def *upc, uint16_t startPos, uint16_t len);
// 解析环形缓冲区数据，返回是否成功解析出一帧
bool UART_Protocol_Ctrl_ParseFrame(UartProtocolCtrl_Def *upc);
// 清除已完成标志
void UART_Protocol_Ctrl_ClearFrameDone(UartProtocolCtrl_Def *upc);
// 发送
void UART_Protocol_SendFrame(UartProtocolCtrl_Def *upc, UartProtocol_Def *frame);

extern UartProtocolCtrl_Def uartProtocolCtrl;
#endif